package com.jtjrenren.android.taxi.driver.manger.push.cmd;

import com.jtjrenren.android.taxi.driver.manger.AppManger;
import com.jtjrenren.android.taxi.driver.utils.ModuleUtils;
import com.library.utils.ConvertUtils;

/**
 * Created by Administrator on 2016/2/26.
 */
public class ControlCmd extends Protocl {
    /**
     * 获取司机的手机号
     *
     * @return
     */
    private static String getDriverPhone() {
        String phone = "11111111111";
        if (AppManger.getInstance().driver != null)
            phone = AppManger.getInstance().driver.getMobilePhone();
        return phone;
    }


    /**
     * 获取消息体流水号,进行加锁处理
     *
     * @return
     */
    protected synchronized static int getSerialNo() {
        AppManger.getInstance().serial_no = (AppManger.getInstance().serial_no + 1) % 9999;
        return AppManger.getInstance().serial_no;
    }

    /**
     * 获取心跳包
     *
     * @return
     */
    public static String getHeartCmd() {
        return getCmd(CMD_SEND_HEART, "");
    }

    /**
     * 获取通用回复
     *
     * @param centerMsgSer 中心的消息流水号
     * @param centerMsgID  中心的消息id
     * @param msgResult    结果，	0：成功/确认；1：失败；2：消息有误；
     */
    public static String getCommonResponse(int centerMsgSer, String centerMsgID, int msgResult) {
        StringBuilder sb = new StringBuilder();
        sb.append(fillingZero(intToHexInt(centerMsgSer), 4, false)).append(centerMsgID).append("0" + msgResult);
        return getCmd(CMD_SEND_COMMON, sb.toString());
    }

    /**
     * 获取鉴权cmd
     *
     * @param token
     * @param version
     * @param bz
     */
    public static String getJqCmd(String token, String version, String bz) {
        StringBuilder sb = new StringBuilder();
        sb.append(getString(token)).append(version).append(bz);
        return getCmd(CMD_SEND_JQ, sb.toString());
    }

    /**
     * 抢单
     *
     * @param orderID
     * @return
     */
    public static String getQdCmd(String orderID) {
        return getCmd(CMD_SEND_QD, getOrderSerialNo(orderID));
    }

    /**
     * 去接乘客
     *
     * @param orderID
     */
    public static String getQjCkCmd(String orderID) {
        return getCmd(CMD_SEND_JK, getOrderSerialNo(orderID));
    }

    /**
     * 确认乘客上车
     *
     * @param orderID
     */
    public static String getQrCkScCmd(String orderID) {
        return getCmd(CMD_SEND_CKSC, getOrderSerialNo(orderID));
    }

    /**
     * 驾驶员电召任务完成确认
     *
     * @param orderID
     */
    public static String getOrderFinishCmd(String orderID) {
        return getCmd(CMD_SEND_FINSH, getOrderSerialNo(orderID));
    }

    /**
     * 驾驶员取消订单
     *
     * @param orderID
     */
    public static String getOrderCancleCmd(String orderID, int cancleReason) {
        StringBuilder sb = new StringBuilder();
        sb.append(getOrderSerialNo(orderID)).append(fillingZero(cancleReason + "", 2, false));

        return getCmd(CMD_SEND_CANCLE, sb.toString());
    }

    /**
     * 提交费用信息  里程（保留一位小数）要乘10
     *
     * @param orderID
     * @param payType  1:提交乘客付费; 2:使用现金支付
     * @param useTime  hhmm
     * @param distance 保留一位小数
     * @param cost     保留一位小数
     * @param tip      保留一位小数
     * @return
     */
    public static String getCommitCost(String orderID, int payType, String useTime,
                                       float distance, String cost, String tip, String info, boolean isyzc) {
        StringBuilder sb = new StringBuilder();
        sb.append(getOrderSerialNo(orderID)).append(fillingZero(payType + "", 2, false))
                .append(fillingZero(ConvertUtils.bytes2hex(ConvertUtils.str2Bcd(useTime)), 4, false))
                .append(fillingZero(ConvertUtils.bytes2hex(ConvertUtils.str2Bcd((int) distance * 10 + "")), 6, false))
                .append(getString(ModuleUtils.DesEncry(cost))).append(getString(ModuleUtils.DesEncry(tip)));

        if (isyzc)
            sb.append(getString(info));

        String head=CMD_SEND_TJFY;
        if (isyzc)
            head=CMD_SEND_TJFY_SPECAR;

        return getCmd(head, sb.toString());
    }

    /**
     * 驾驶员上下班
     *
     * @param workStatus 0：上班，1：下班
     * @param bz
     * @return
     */
    public static String getDriverWorkStatus(int workStatus, String bz) {
        StringBuilder sb = new StringBuilder();
        sb.append(fillingZero(intToHexInt(workStatus), 2, false)).append(getString(bz));
        return getCmd(CMD_SEND_SXB, sb.toString());
    }

    /**
     * 上传位置信息
     *
     * @param time yyMMddHHmmss
     * @return
     */
    public static String getPushPositionMsg(boolean isGps, int carStatus, String lat, String lng, float speed, int direction, String time) {
        speed = ModuleUtils.formatPoint(speed, 1);

        StringBuilder sb = new StringBuilder();
        sb.append("00000000").append(getCarLocStatusCmd(isGps, carStatus)).append(latLngToUINT32Hex(lat)).append(latLngToUINT32Hex(lng))
                .append(fillingZero(Integer.toHexString((int) speed * 10), 4, false)).append(fillingZero(Integer.toHexString(direction), 2, false))
                .append(fillingZero(ConvertUtils.bytes2hex(ConvertUtils.str2Bcd(time)), 12, false));

        return getCmd(CMD_SEND_LC, sb.toString());
    }

    /**
     * 专车驾驶员提交乘客付费或确认乘客现金支付
     */
    public static String getPushSpecarCostMsg(String orderID, int payType, String useTime, float distance, String cost, String tip, String bz) {
        StringBuilder sb = new StringBuilder();
        sb.append(getOrderSerialNo(orderID)).append(fillingZero(Integer.toHexString(payType), 2, false))
                .append(fillingZero(ConvertUtils.bytes2hex(ConvertUtils.str2Bcd(useTime)), 4, false))
                .append(fillingZero(ConvertUtils.bytes2hex(ConvertUtils.str2Bcd((int) distance * 10 + "")), 6, false))
                .append(getString(ModuleUtils.DesEncry(cost))).append(getString(ModuleUtils.DesEncry(tip))).append(getString(bz));

        return getCmd(CMD_SEND_TJSPECARFY, sb.toString());
    }

    /**
     * 获取封装的协议
     * 标识位  消息头 消息体 校验码 标识位
     *
     * @param msgID
     * @param content
     */
    public static String getCmd(String msgID, String content) {
        if (content == null)
            content = "";

        StringBuilder sb = new StringBuilder();
        sb.append(getCmdHeader(msgID, content.length() / 2)).append(content)
                .append(ConvertUtils.byteToHexStr(getProtoclCheckCode(ConvertUtils.HexStrToByte(sb.toString()))));

        return (FLAG_CMD + getTransferredProtocl(sb.toString()) + FLAG_CMD).toUpperCase();
    }

    /**
     * 获取协议的消息头
     *
     * @param msgID   已经是字符串
     * @param contLen 消息体长度-字节
     * @return
     */
    public static String getCmdHeader(String msgID, int contLen) {
        StringBuilder sb = new StringBuilder();
        sb.append(msgID).append(getContentLen(contLen))
                .append(getDriverPhoneCmd(getDriverPhone()))
                .append(getSerCmd(getSerialNo()));

        return sb.toString();
    }
}
